/**
 * Copyright(C): CETC-32
 * @Title: CenterAuthShiroConfig
 * @Description: 自定义Realm
 * @author: youqing
 * @version: 1.0
 * @date: 2020/9/11 10:55
 * 更改描述：
 */
package com.cetc32.dh.common.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
 * 响应状态信息接口
 * @author: youqing
 * @version: 1.0
 * @date: 2020/9/11 10:55
 * 更改描述：
 */
public class JWTUtil {
    //token有效时长
    private static final long  EXPIRE=1*60*100;
    //token的密钥
    private static final String SECRET="jwt+shiro+32s";

    /**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     * 修改信息：
     */
    public  static String createToken(String username,long current){
        Date date= new Date(current+EXPIRE);
        //JWT的header部分
        Map<String ,Object> map =new HashMap<>();
        map.put("alg","HS256");
        map.put("typ","JWT");

        //使用JWT生成 token
        String token=null;
        try{
            token= JWT.create()
                    .withHeader(map)
                    .withClaim("username",username)
                    .withClaim("curent",current)
                    .withIssuedAt(new Date())
                    .withExpiresAt(date)
                    .sign(Algorithm.HMAC256(SECRET));
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
        return token;
    }

    ////校验token的有效性，1、token的header和payload是否没改过；2、没有过期
        /**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     * 修改信息：
     */
    public static boolean verify(String token){
        try{
            JWTVerifier verifier=JWT.require(Algorithm.HMAC256(SECRET)).build();
            verifier.verify(token);
            return true;
        }catch ( Exception e){

        }
        return false;
    }
    //无需解密也可以获取token的信息
    /**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     * 修改信息：
     */
    public static String getUsername(String token){
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("username").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }

    //获取过期时间
    /**
     * 指定缓存失效时间
     * @param key 键
     * @param time 时间(秒)
     * @return
     * 修改信息：
     */
    public static Long getExpire(String token){
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("current").asLong();
        }catch (Exception e){
            return null;
        }
    }
}
